package Obrero;

import java.io.IOException;
import java.io.Serializable;
import servidor1.Servidor;
import principal.*;

public class Obrero implements Runnable, Serializable {
	/**
	 * 
	 */
	private String nombre;
	private boolean encontrado;
	private static final long serialVersionUID = 1L;
	
	//TODO LO QUE ES TRANSIENT NO SE ENVIA
	private transient Character busca;
	private transient char[][] sopa;
	private transient Thread hilo = new Thread(this); // VER SI ESTA BIEN ESTO (NO SE ESTA 
													  //ENVIANDO EL HILO, QUE ES EL OBRERO...

	
	private transient servidor1.Servidor servidor;
	private transient PrincipalView principal;

    public Obrero(String nombre) {
        this.nombre=nombre;
    }
	
	public void start(){
		hilo.start();
	}
	
	@SuppressWarnings("deprecation")
	public void finalizar(){
		hilo.stop();
	}
	
	public Obrero(String nombre, char[][] sopa, Servidor server, PrincipalView p){
                principal = p;
		this.servidor=server;
		this.sopa=sopa;
		this.nombre=nombre;
		encontrado=false;
		
		}
	
	public void run(){
	
			try {
                                String metodo = "busco" + this.getname();
                                principal.EjecutarMetodoServidorIniciado(metodo);
				busqueda(sopa,nombre);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	
		//getname();
		//getEstado();
		
	}
	
	public  void busqueda(char[][] sopa, String nombre) throws IOException
	{
		int matriz_columnas=30, matriz_filas=30;
		int cantidad =0;
		Boolean flagletra=false;
		Boolean flagpalabra= false;
		String resultados[]=new String[100];
		
		busca=nombre.charAt(0);
	
			
		//*******************inicio del for anidado********************************
		for(int x=0; x<matriz_filas;x++){
			porcentaje(x);
			for(int y=0; y<matriz_columnas;y++){
				flagletra = busca.equals((char)(sopa[x][y]));
				switch(flagletra.compareTo(false)){//si es falso es 0; si es verdadero es 1
				case 0:
					//System.out.println("fue falso, sigo buscando");
					break;
				case 1:
					//System.out.println("fue verdadero, entro a la funcnion");
					flagpalabra=enDireccion(nombre, sopa, x, y,resultados, cantidad);
					cantidad = cantidad + flagpalabra.compareTo(false);
					// si la palabra fue  encontrada seria: cantidad=cantidad+1
					// Si no lo fue seria cantidad=cantidad + 0
					break;	
				}	
			}
		}
		//*******************final del for anidado***********************************
		//mostrarRes(resultados);
		switch(cantidad){
		case 0:
			//no encontro un carajo
			break;
		default:
			encontrado();
			break;
		}
		
		
	}
			

	
	private void porcentaje(int a) {
		double total;
		total=((double)a/29)*100;

                String metodo = "setPorcentaje" + this.getname();
                principal.EjecutarMetodoServidorIniciado(metodo,(int)total);
		try {
			hilo.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	private boolean enDireccion(String nombre2, char[][] sopa, int x, int y, String[]resultados,int cantidad)
	{
		
		String guardar="nombre: "+nombre2+". Posicion: ("+x+","+y+"), En direccion hacia ";
		
		Boolean encontre=false;
		Boolean encontre1=false;
		Boolean encontre2=false;
		Boolean encontre3=false;
		Boolean encontre4=false;
		
		encontre1=compararDerecha(nombre2,sopa,x,y);
		switch (encontre1.compareTo(false)){
		case 1:
			resultados[cantidad]=guardar.concat("la derecha.");
			break;
		case 0:
			break;
		default:
			break;}
		
		
		encontre2=compararIzquierda(nombre2,sopa,x,y);
		switch (encontre2.compareTo(false)){
		case 1:
			resultados[cantidad]=guardar.concat("la izquierda.");
			break;
		case 0:
			break;
		default:
			break;}
		
		
		encontre3=compararArriba(nombre2,sopa,x,y);
		switch (encontre3.compareTo(false)){
		case 1:
			resultados[cantidad]=guardar.concat("arriba.");
			break;
		case 0:
			break;
		default:
			break;}
		
		
		encontre4=compararAbajo(nombre2,sopa,x,y);
		switch (encontre4.compareTo(false)){
		case 1:
			resultados[cantidad]=guardar.concat("abajo.");
			break;
		case 0:
			break;
		default:
			break;}
		
		
		encontre=encontre1||encontre2||encontre3||encontre4;
		return encontre;
	}


	private boolean compararDerecha(String nombre2, char[][] sopa, int x, int y) {
		Boolean valor=false;
		String acomparar="";
		
		try{
			for (int i=y; i<y+nombre2.length();i++){
				acomparar=acomparar+(sopa[x][i]);}
			}
		catch(Exception ex){}
		
		valor = nombre2.equals(acomparar);
		//System.out.println("(compararDerecha)comparo el nombre: "+nombre2+", con: "+acomparar+". retorno: "+valor);
		
		return valor;
	}
	
	
	private boolean compararIzquierda(String nombre2, char[][] sopa, int x, int y) {
		Boolean valor=false;
		String acomparar="";
		
		try{
			for (int i=y; i>y-nombre2.length();i--){
				acomparar=acomparar+(sopa[x][i]);}
			}
		catch(Exception ex){}
		
		valor = nombre2.equals(acomparar);
		
		//System.out.println("(compararIzquierda)comparo el nombre: "+nombre2+", con: "+acomparar+". retorno: "+valor);
		return valor;
	}
	
	private boolean compararArriba(String nombre2, char[][] sopa, int x, int y) {
		Boolean valor=false;
		String acomparar="";
		
		try{
			for (int i=x; i>x-nombre2.length();i--){
				acomparar=acomparar+(sopa[i][y]);}
			}
		catch(Exception ex){}
		
		valor = nombre2.equals(acomparar);
		
		//System.out.println("(compararArriba)comparo el nombre: "+nombre2+", con: "+acomparar+". retorno: "+valor);
		
		return valor;
	}
	
	private boolean compararAbajo(String nombre2, char[][] sopa, int x, int y) {
		Boolean valor=false;
		String acomparar="";
		
		try{
			for (int i=x; i<x+nombre2.length();i++){
				acomparar=acomparar+(sopa[i][y]);}
			}
		catch(Exception ex){}
		
		valor = nombre2.equals(acomparar);
		
		//System.out.println("(compararAbajo)comparo el nombre: "+nombre2+", con: "+acomparar+". retorno: "+valor);
		
		return valor;	
	}
	


	
	public static void mostrarRes(String[] res){
		int i;
		
		int filas=res.length; 
		for(i=0;i<filas&&res[i]!=null;i++){
			System.out.println(res[i]);
		}
		System.out.println("Total : "+i+" encontrados.");
	}
	
	
	public String getname()
	{
		return nombre;
	}
	
	public boolean getEstado()
	{
		return encontrado;
	}
	
	public void encontrado() throws IOException
	{
		encontrado=true;
		servidor.enviar_dato(this);
	}
	
}